/-imports
/-storage ...
/-storage/attached ...
AttachedStorage.ts
LocalStorageStorage.ts
WebSQLStorage.ts
/-typings
stringUtils.ts
teapo.html
104
    }
105
 
106
  }
107
  
108
  export module WebSQLStorage {
109
 
110
    export function detect(uniqueKey: string, callback: (error: Error, storage: AttachedStorage) => void, windowOverride = window) {
111
 
112
      var _openDatabase: typeof openDatabase = (<any>windowOverride).openDatabase;
113
 
114
      if (!_openDatabase) {
115
        callback(new Error('Browser does not expose openDatabase.'), null);
116
        return;
117
      }
118
 
119
      var mangler = new NameMangler();
120
 
121
      var dbName = mangler.mangleDatabaseObjectName(uniqueKey) || 'teapo';
122
      var db: Database;
123
 
124
      try {
125
        db = _openDatabase(dbName, 1, 'Teapo filesystem database.', 1024*1024);
126
      }
127
      catch (openDatabaseError) {
128
        callback(openDatabaseError, null);
129
        return;
130
      }
131
 
132
      var storage = new WebSQLStorage(db);
133
      
134
      callback(null, storage);
135
    }
136
 
137
    export class NameMangler {
138
 
139
      private static _safeCharacters = '1234567890abcdefghijklmnopqrst_()/';
140
      private _cache: { [name: string]: string; } = {};
141
 
142
      constructor() {
143
      }
144
 
145
      mangleDatabaseObjectName(name: string): string {
146
        return name;
147
      }
148
    
149
      unmangleDatabaseObjectName(name: string): string {
150
        return name;
151
      }
152
    }
153
 
154
    export function wrapSQLError(sqlError: SQLError): Error {
155
      return new Error(sqlError.message + ' [' + sqlError.code + ']');
156
    }
157
  }
158
 
159
}